# 继承自CanvasLayer类，用于在画布层显示对话框
extends CanvasLayer

# 使用@onready注解延迟加载Panel节点，避免在场景初始化时加载
@onready var panel = $Panel
# 使用@onready注解延迟加载Label节点，避免在场景初始化时加载
@onready var label = $Panel/VBoxContainer/Label


var current_lines: Array = []  # 存储当前对话行的数组
var current_index: int = 0  # 当前对话行的索引
var dialog_closing: bool = false  # 标记对话框是否正在关闭

# 节点准备就绪时调用的函数
func _ready() -> void:
	# 初始状态下隐藏对话框
	panel.visible = false

# 显示对话框的函数，传入对话行的数组
func show_dialog(lines: Array) -> void:
	# 检查是否可以显示对话框
	if lines.is_empty() or panel.visible or dialog_closing:
		# 如果条件不满足，直接返回
		return
	current_lines = lines  # 设置当前对话行为传入的数组
	current_index = 0  # 重置当前对话行的索引为0
	dialog_closing = false  # 标记对话框未关闭
	_show_current_line()  # 显示当前对话行

# 显示当前对话行的函数
func _show_current_line() -> void:
	panel.visible = true 	# 显示对话框面板
	# 设置Label的文本为当前对话行的内容，添加数组边界检查
	if current_lines.size() > current_index:
		label.text = str(current_lines[current_index])
	else:
		label.text = ""

# 处理输入事件的函数
func _input(event) -> void:
	# 检查对话框是否可见或正在关闭
	if not panel.visible or dialog_closing:
		# 如果条件不满足，直接返回
		return
	# 检测当前事件是否为键盘按键按下事件，并且不是长按时的重复触发
	if event is InputEventKey and event.pressed and not event.echo:
		# 检查是否按下了交互键
		if Input.is_action_just_pressed("interact"):
			# 判断是否是最后一句对话
			if current_index >= current_lines.size() - 1:
				dialog_closing = true# 如果是最后一句则标记对话框正在关闭
				_close_dialog()# 关闭对话框
				return  # 添加return防止继续执行下面的_show_current_line()
			# 不是最后一句则显示下一行对话
			else:
				current_index += 1  # 增加当前对话行的索引
				_show_current_line()  # 显示当前对话行

func _close_dialog() -> void: #关闭对话的函数
	panel.visible = false # 隐藏对话框
	current_lines = []  #重置对话内容数组
	current_index = 0  # 重置当前对话行的索引为0
	var timer = get_tree().create_timer(0.1)  #设置一个0.1s的计时器
	#0.1s后将dialog_closing标志重置为false，防止在对话框刚刚关闭时立即再次触发新的对话
	timer.timeout.connect(func(): dialog_closing = false)
